home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Inside Mac Games Volume 5 #3
/
IMG 46 Vol 5-3.iso
/
More Goodies
/
More For Your Game
/
Realmz
/
Character Master Source
/
Nemesis Framework
/
Sources
/
nemesis files.cpp
< prev
next >
Wrap
Text File
|
1996-07-03
|
14KB
|
742 lines
//•••••••••••••••••••••••••••••••••••••••••
// Some functions to read data from files
//•••••••••••••••••••••••••••••••••••••••••
OSErr NemesisReadData( FSSpec fileSpec, long offset, long numBytes, Handle &buffer )
{
OSErr error = noErr;
short fileID;
error = FSpOpenDF( &fileSpec, fsRdPerm, &fileID );
if( error )
{
fileID = 0;
return error;
}
error = SetFPos( fileID, fsFromStart, offset );
if( error )
{
FSClose( fileID );
return error;
}
error = FSRead( fileID, &numBytes, *buffer );
if( error )
{
FSClose( fileID );
return error;
}
FSClose( fileID );
return error;
}
OSErr NemesisReadOneByte( FSSpec fileSpec, long offset, SInt8 &theValue )
{
OSErr error = noErr;
Handle buffer;
error = NemesisAllocateHandle( kOneByte, &buffer );
if( error )
{
theValue = 0;
return error;
}
NemesisLockHandle( buffer );
error = NemesisReadData( fileSpec, offset, kOneByte, buffer );
if( error )
{
theValue = 0;
return error;
}
theValue = **buffer;
NemesisDisposeHandle( &buffer );
return error;
}
OSErr NemesisReadTwoBytes( FSSpec fileSpec, long offset, SInt16 &theValue )
{
OSErr error = noErr;
Handle buffer;
error = NemesisAllocateHandle( kTwoBytes, &buffer );
if( error )
{
theValue = 0;
return error;
}
NemesisLockHandle( buffer );
error = NemesisReadData( fileSpec, offset, kTwoBytes, buffer );
if( error )
{
theValue = 0;
return error;
}
theValue = (SInt16 &)**buffer;
NemesisDisposeHandle( &buffer );
return error;
}
OSErr NemesisReadFourBytes( FSSpec fileSpec, long offset, SInt32 &theValue )
{
OSErr error = noErr;
Handle buffer;
error = NemesisAllocateHandle( kFourBytes, &buffer );
if( error )
{
theValue = 0;
return error;
}
NemesisLockHandle( buffer );
error = NemesisReadData( fileSpec, offset, kFourBytes, buffer );
if( error )
{
theValue = 0;
return error;
}
theValue = (SInt32 &)**buffer;
NemesisDisposeHandle( &buffer );
return error;
}
OSErr NemesisReadCString( FSSpec fileSpec, long offset, long maxBytes, char *theString )
{
OSErr error = noErr;
Handle buffer;
short fileID;
long count;
Boolean EOString;
long tempLong;
error = FSpOpenDF( &fileSpec, fsRdPerm, &fileID );
if( error )
{
theString[0] = (char)0; // Nullify string…
fileID = 0;
return error;
}
error = NemesisAllocateHandle( 1, &buffer );
if( error )
{
theString[0] = (char)0; // Nullify string…
FSClose( fileID );
return error;
}
NemesisLockHandle( buffer );
error = SetFPos( fileID, fsFromStart, offset );
if( error )
{
theString[0] = (char)0; // Nullify string…
FSClose( fileID );
return error;
}
EOString = false;
count = 0;
do
{
tempLong = 1; // For FSRead
error = FSRead( fileID, &tempLong, *buffer );
if( error ) // Check for errors and close file and exit if there was one
{
theString[count] = (char)0; // Put null at end of string.
FSClose( fileID );
return error;
}
theString[count] = (char)**buffer; // Add character to string.
if( (count >= maxBytes) || (theString[count]==0) ) // Check for end
{
EOString = true;
theString[count] = 0; // Make sure last character is null
}
else
EOString = false;
++count;
}while( !EOString );
FSClose( fileID );
NemesisDisposeHandle( &buffer );
return error;
}
OSErr NemesisReadPString( FSSpec fileSpec, long offset, long maxBytes, Str255 theString )
{
OSErr error = noErr;
Handle buffer;
short fileID;
long count;
long tempLong;
if( maxBytes > 256 )
maxBytes = 256; // 256 is max number of chars for a pascal string (length+string)
error = FSpOpenDF( &fileSpec, fsRdPerm, &fileID );
if( error )
{
theString[0] = (char)0; // Nullify string…
fileID = 0;
return error;
}
error = NemesisAllocateHandle( 1, &buffer );
if( error )
{
theString[0] = (char)0; // Nullify string…
FSClose( fileID );
return error;
}
NemesisLockHandle( buffer );
error = SetFPos( fileID, fsFromStart, offset );
if( error )
{
theString[0] = (char)0; // Nullify string…
FSClose( fileID );
return error;
}
// Check how long the string is…
tempLong = 1; // For FSRead
error = FSRead( fileID, &tempLong, *buffer );
if( error ) // Check for errors and close file and exit if there was one
{
theString[0] = 0; // Nullify string…
FSClose( fileID );
return error;
}
// Set max length of string
tempLong = (long)**buffer;
if( tempLong < maxBytes )
maxBytes = tempLong;
theString[0] = (char)maxBytes;
// Loop till we have read it all…
// (Remeber to start from 1 'cos we have already read the first
// byte and the position marker has moved on)
for( count = 1; count <= maxBytes; count++ )
{
tempLong = 1; // For FSRead
error = FSRead( fileID, &tempLong, *buffer );
if( error ) // Check for errors and close file and exit if there was one
{
theString[0] = (count-1); // Put number of chars at beginning of string.
FSClose( fileID );
return error;
}
theString[count] = (char)**buffer; // Add character to string.
}
FSClose( fileID );
NemesisDisposeHandle( &buffer );
return error;
}
OSErr NemesisCreateTempFile( FSSpec realFile, FSSpec &tempFile, OSType theCreator, OSType theType )
{
OSErr error = noErr;
Str255 tempFileName;
short tempVRefNum;
long tempFileID;
unsigned long seconds;
Handle buffer;
short fileID;
long fileSize = 0;
long tempFSize = 0;
/* make up a temporary filename */
GetDateTime( &seconds );
NumToString( seconds, tempFileName );
/* find the temporary folder, create it if necessary */
/* temp file and original must be on same volume, or FSpExchangeFiles() chokes */
error = FindFolder( realFile.vRefNum,
kTemporaryFolderType,
kCreateFolder,
&tempVRefNum,
&tempFileID);
if (error)
{
return error;
}
/* make an FSSpec for the temporary filename */
error = FSMakeFSSpec( tempVRefNum,
tempFileID,
tempFileName,
&tempFile);
if (error == fnfErr) /* if the file is not found */
{
error = noErr; /* not a problem, it doesn't exist yet */
}
// Now create a duplicate file
error = FSpCreate( &tempFile, theCreator, theType, smSystemScript );
if( error )
{
return error;
}
error = FSpOpenDF( &realFile, fsRdPerm, &fileID );
if( error )
{
fileID = 0;
return error;
}
error = GetEOF( fileID, &fileSize );
if( error )
{
FSClose( fileID );
return error;
}
tempFSize = fileSize; // tempFSize is needed for FSWrite
error = NemesisAllocateHandle( fileSize, &buffer );
if( error )
{
FSClose( fileID );
return error;
}
NemesisLockHandle( buffer );
error = SetFPos( fileID, fsFromStart, 0 );
if( error )
{
FSClose( fileID );
return error;
}
error = FSRead( fileID, &fileSize, *buffer );
if( error )
{
FSClose( fileID );
return error;
}
FSClose( fileID ); // Close original file
// Now to write the data to the temporary file
error = FSpOpenDF( &tempFile, fsRdWrPerm, &fileID );
if( error )
{
fileID = 0;
return error;
}
error = SetFPos( fileID, fsFromStart, 0 );
if( error )
{
FSClose( fileID );
return error;
}
error = FSWrite( fileID, &tempFSize, *buffer );
if( error )
{
FSClose( fileID );
}
else
{
error = FSClose( fileID );
if( !error )
{
error = FlushVol( nil, tempFile.vRefNum );
}
}
// Release the buffer
NemesisDisposeHandle( &buffer );
return error;
}
OSErr NemesisDeleteTempFile( FSSpec &tempFile, FSSpec &origFile )
{
OSErr error = noErr;
error = FSpExchangeFiles( &tempFile, &origFile );
if( !error )
{
error = FSpDelete( &tempFile );
}
return error;
}
OSErr NemesisWriteData( FSSpec &fileSpec, long offset, long numBytes, const Handle buffer )
{
OSErr error = noErr;
short fileID;
// Open file
error = FSpOpenDF( &fileSpec, fsRdWrPerm, &fileID );
if( error )
{
fileID = 0;
return error;
}
error = SetFPos( fileID, fsFromStart, offset );
if( error )
{
FSClose( fileID );
return error;
}
error = FSWrite( fileID, &numBytes, *buffer );
if( error )
{
FSClose( fileID );
}
else
{
error = FSClose( fileID );
}
return error;
}
OSErr NemesisWrite1Data( FSSpec &fileSpec, long offset, long numBytes, const SInt8 **buffer )
{
OSErr error = noErr;
short fileID;
// Open file
error = FSpOpenDF( &fileSpec, fsRdWrPerm, &fileID );
if( error )
{
fileID = 0;
return error;
}
error = SetFPos( fileID, fsFromStart, offset );
if( error )
{
FSClose( fileID );
return error;
}
error = FSWrite( fileID, &numBytes, *buffer );
if( error )
{
FSClose( fileID );
}
else
{
error = FSClose( fileID );
}
return error;
}
OSErr NemesisWrite2Data( FSSpec &fileSpec, long offset, long numBytes, const SInt16 **buffer )
{
OSErr error = noErr;
short fileID;
// Open file
error = FSpOpenDF( &fileSpec, fsRdWrPerm, &fileID );
if( error )
{
fileID = 0;
return error;
}
error = SetFPos( fileID, fsFromStart, offset );
if( error )
{
FSClose( fileID );
return error;
}
error = FSWrite( fileID, &numBytes, *buffer );
if( error )
{
FSClose( fileID );
}
else
{
error = FSClose( fileID );
}
return error;
}
OSErr NemesisWrite4Data( FSSpec &fileSpec, long offset, long numBytes, const SInt32 **buffer )
{
OSErr error = noErr;
short fileID;
// Open file
error = FSpOpenDF( &fileSpec, fsRdWrPerm, &fileID );
if( error )
{
fileID = 0;
return error;
}
error = SetFPos( fileID, fsFromStart, offset );
if( error )
{
FSClose( fileID );
return error;
}
error = FSWrite( fileID, &numBytes, *buffer );
if( error )
{
FSClose( fileID );
}
else
{
error = FSClose( fileID );
}
return error;
}
OSErr NemesisWriteOneByte( FSSpec fileSpec, long offset, SInt8 theValue )
{
OSErr error = noErr;
SInt8 **buffer;
error = NemesisAllocateHandle( kOneByte, (Handle *)&buffer );
if( error )
{
return error;
}
NemesisLockHandle( (Handle)buffer );
**buffer = theValue;
error = NemesisWrite1Data( fileSpec, offset, kOneByte, buffer );
if( error )
{
return error;
}
NemesisDisposeHandle( (Handle *)&buffer );
return error;
}
OSErr NemesisWriteTwoBytes( FSSpec fileSpec, long offset, SInt16 theValue )
{
OSErr error = noErr;
SInt16**buffer;
error = NemesisAllocateHandle( kTwoBytes, (Handle *)&buffer );
if( error )
{
return error;
}
NemesisLockHandle( (Handle)buffer );
**buffer = theValue;
error = NemesisWrite2Data( fileSpec, offset, kTwoBytes, buffer);
if( error )
{
return error;
}
NemesisDisposeHandle( (Handle *)&buffer );
return error;
}
OSErr NemesisWriteFourBytes( FSSpec fileSpec, long offset, SInt32 theValue )
{
OSErr error = noErr;
SInt32**buffer;
error = NemesisAllocateHandle( kFourBytes, (Handle *)&buffer );
if( error )
{
return error;
}
NemesisLockHandle( (Handle)buffer );
**buffer = theValue;
error = NemesisWrite4Data( fileSpec, offset, kFourBytes, buffer );
if( error )
{
return error;
}
NemesisDisposeHandle( (Handle *)&buffer );
return error;
}
OSErr NemesisWriteCString( FSSpec fileSpec, long offset, long maxBytes, const char *theString )
{
OSErr error = noErr;
Handle buffer;
short fileID;
long count;
Boolean EOString;
long tempLong;
error = FSpOpenDF( &fileSpec, fsRdPerm, &fileID );
if( error )
{
fileID = 0;
return error;
}
error = NemesisAllocateHandle( 1, &buffer );
if( error )
{
FSClose( fileID );
return error;
}
NemesisLockHandle( buffer );
error = SetFPos( fileID, fsFromStart, offset );
if( error )
{
FSClose( fileID );
return error;
}
EOString = false;
count = 0;
do
{
**buffer = theString[count];
tempLong = 1; // For FSWrite
error = FSWrite( fileID, &tempLong, *buffer );
if( error ) // Check for errors and close file and exit if there was one
{
FSClose( fileID );
return error;
}
if( (count >= maxBytes) || (theString[count]==0) ) // Check for end
{
EOString = true;
**buffer = (char)0;
error = FSWrite( fileID, &tempLong, *buffer ); // Make EOS null
if( error ) // Check for errors and close file and exit if there was one
{
FSClose( fileID );
return error;
}
}
else
EOString = false;
++count;
}while( !EOString );
FSClose( fileID );
NemesisDisposeHandle( &buffer );
return error;
}
OSErr NemesisWritePString( FSSpec fileSpec, long offset, long maxBytes, const Str255 theString )
{
OSErr error = noErr;
Handle buffer;
short fileID;
long count;
long tempLong;
if( maxBytes > 256 )
maxBytes = 256; // 256 is max number of chars for a pascal string (length+string)
error = FSpOpenDF( &fileSpec, fsRdPerm, &fileID );
if( error )
{
fileID = 0;
return error;
}
error = NemesisAllocateHandle( 1, &buffer );
if( error )
{
FSClose( fileID );
return error;
}
NemesisLockHandle( buffer );
error = SetFPos( fileID, fsFromStart, offset );
if( error )
{
FSClose( fileID );
return error;
}
// Check how long the string is…
tempLong = (long)theString[0];
if( tempLong < maxBytes )
maxBytes = tempLong;
// Loop till we have written it all…
for( count = 0; count <= maxBytes; count++ )
{
tempLong = 1; // For FSWrite
**buffer = theString[count];
error = FSWrite( fileID, &tempLong, *buffer );
if( error ) // Check for errors and close file and exit if there was one
{
FSClose( fileID );
return error;
}
}
FSClose( fileID );
NemesisDisposeHandle( &buffer );
return error;
}
Boolean NemesisSameFileSpec( const FSSpec &fileOne, const FSSpec &fileTwo)
{
Boolean result = false;
if ( (fileOne.vRefNum != fileTwo.vRefNum) // Check volumes
|| (fileOne.parID != fileTwo.parID)) // Check directories
{
return result; // Not the same
}
// Now check the name
result = (EqualString(fileOne.name, fileTwo.name, false, true));
return result;
}